package com.rover.system.dao;


import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;

public interface BaseDao {

    /**
     *  保存
     * * @param <T>
     * @return
     */
	public <T> void save(T o);
	/**
	 * 根据实体删除数据
	 * @param <T>
	 * @return
	 */
	public <T> void delete(T o);
	/**
	 * 根据实体删除数据
	 * @param c  类
	 * @param id  主键
	 * @return
	 */
	public void delete(Class c,Serializable  id);
    /**
     * 根据实体删除数据
     * @param entitys  类
     * @return
     */
    public <T> void deleteAllEntitie(Collection<T> entitys);
    /**
     * 根据主键List删除数据
     * @param list  类
     * @return
     */
    public  void delete(Class c,Collection<Integer> list);
	/**
	 * 更新数据
	 * @param <T>
	 * @return
	 */
	public <T> void update(T o);
	/**
	 * 插入或者更新数据（根据主键）
	 * @param <T>
	 * @return
	 */
	public <T> void saveOrUpdate(T o);
    /**
     *批量保存数据
     * @param <T>
     * @return
     */
    public <T> void batchSave(List<T> entitys);
	/**
	 * 根据实体名称和主键获取实体
	 * 
	 * @param <T>
	 * @param  c entityName
	 * @param id
	 * @return
	 */
	public <T> T get(Class c, Serializable id);



	/**
	 * 根据实体名称和主键获取实体
	 * 
	 * @param hql
	 * @param params
	 * @return
	 */
	public <T> T get(String hql, Map<String, Object> params);



	/**
	 * 返回全部实体
	 * @param hql
	 * @param params
	 * @return
	 */
	public <T>  List<T> findHql(String hql, Map<String, Object> params);

	/**
	 * 分页返回全部实体
	 * @param hql
	 * @param page
	 * @param rows
	 * @return
	 */
	public <T>  List<T> findPageHql(String hql, int page, int rows);
	/**
	 * 分页返回全部实体
	 * @param hql
	 * @param params  条件
	 * @param page
	 * @param rows
	 * @return
	 */
	public <T>  List<T> findPageHql(String hql, Map<String, Object> params, int page, int rows);




    /**
     * 返回唯一结果
     * @param 	hql 语句(参数用冒号加参数名，例如select count(*) from tb where id=:id)
     * @return
     */
    public Object uniqueResultHql(String hql, Map<String, Object> params);

	/**
	 * 执行hql语句带参数
	 * @param hql
	 * @param params
	 * @return
	 */
	public int executeHql(String hql, Map<String, Object> params);

	/**
	 * 根据Hql语句
	 * @param hql      sql语句(参数用冒号加参数名，例如select count(*) from tb )
	 * @param params (key为参数名，value为参数值)* @return value
	 */
	public Long countHql(String hql,Map<String, Object> params ) ;
	

	
	
	
	/*一下是使用sql*/


	/**
	 * 根据sql语句，返回Map对象集合
	 * @param sql 语句(参数用冒号加参数名，例如select count(*) from tb where id=:id)
	 * @param params 参数集合(key为参数名，value为参数值)
	 * @return bean对象
	 */
	public  <T> List<T> findSQLPersistence(Class c,String sql,Map<String, Object> params );
    public <T> List<T> findSQLNonPersistence(Class c,String sql,Map<String, Object> params );
    public <T> List<T> findSQL(String sql,Map<String, Object> params );

	/**
	 * 根据sql语句，返回Map对象集合
	 * @param sql 语句(参数用冒号加参数名，例如select count(*) from tb )
	 * @param  params 参数集合(key为参数名，value为参数值)
	 * @return map
	 */
	public  Object uniqueResultSQL(String sql,Map<String, Object> params );


	/**
	 * 根据Hql语句
	 * @param sql 语句(参数用冒号加参数名，例如select count(*) from tb )
	 * @param params 参数集合(key为参数名，value为参数值)
     *                @return value
	 */
	public Long countSQL(String sql,Map<String, Object> params ) ;



	/**
	 * 执行sql语句带参数
	 * @param sql
	 * @param params
	 * @return
	 */
	public int executeSQL(String sql, Map<String, Object> params);

}
